#ifndef SnakeWidget_H
#define SnakeWidget_H
#include <QWidget>
#include <QPushButton>
#include <QVector>
#include "snakenode.h"
/**
 * 贪吃蛇游戏-游戏区域
 * @brief The SnakeWidget class
 */
class SnakeWidget:public QWidget
{
    Q_OBJECT
public:

    explicit SnakeWidget(QWidget * parent = nullptr);
    virtual ~SnakeWidget()override;
    //方向 左右上下
    enum Direction{ON = 1, RIGHT, DOWN, LEFT};
    /**
     * 初始化
     * @brief init
     */
    void init();

    /**
     * 数据清理
     * @brief clearData
     */
    void clearData();

    /**
     * 开始游戏
     * @brief initSnake
     */
    void startGame();

    /**
     * 随机获取一个节点
     * @brief getRandomHeadNode
     * @@param dsSeed 随机数种子偏移量
     * @return
     */
    SnakeNode * getRandomNode(int dsSeed);
    /**
     * 绘制
     * @brief paintEvent
     * @param event
     */
    void paintEvent(QPaintEvent *event) override;
    /**
     * 绘制背景
     * @brief drawBg
     * @param painter
     */
    void drawBg(QPainter &painter);

    /**
     * 绘制snake
     * @brief drawSnake
     * @param painter
     */
    void drawSnake(QPainter &painter);

    /**
     * 绘制食物节点
     * @brief drawFood
     * @param painter
     */
    void drawFood(QPainter &painter);

    /**
     * 移动
     * @brief snakeMove
     */
    void snakeMove();

    /**
     * 移动节点
     * @brief moveNode
     */
    void moveNode();

    /**
     * 移动单个节点
     * @brief moveOneNode
     * @param node 节点
     * @param nextX 下个位置 x
     * @param nextY 下个位置 y
     */
    void moveOneNode(SnakeNode * node, int nextX, int nextY);

    /**
     * 自动移动
     * @brief autoMove
     */
    void autoMove();

    /**
     * 停止自动移动
     * @brief stopAutoMove
     */
    void stopAutoMove();

    /**
     * 吃到了食物
     * @brief eatEvent
     */
    void eatEvent();

    /**
     * 检测是否死了
     * @brief checkDie
     * @return
     */
    bool checkDie();

    /**
     * 游戏结束
     * @brief gameOver
     */
    void gameOver();

    /**
     * 游戏过关
     * @brief passLevel
     */
    void passLevel();

    /**
     * 键盘事件(由父窗口传递过来)
     * @brief keyPressEvent
     * @param event
     */
    void keyPressEventFromWindow(QKeyEvent *event);

    /**
     * 获取蛇头旋转的角度
     * @brief getHeadRotateAngle
     * @return
     */
    int getHeadRotateAngle();
signals:
    /**
     * 游戏开始信号
     * @brief sinalGameStart
     * @param currentLevel 当前关卡
     * @param passRequiredScore 通关需要的分数
     */
    void signalGameStart(int currentLevel, int passRequiredScore);

    /**
     * 得分信号
     * @brief signalGetScore
     * @param totalScore 总分
     * @param currentLevelScore 当前关卡得分
     */
    void signalGetScore(int totalScore, int currentLevelScore );
public slots:
    //定时移动
    void timeMove();
private:
    volatile int gameStatus = 0;//游戏状态 0：结束 1：进行中
    //画笔
    QPen * pen;
    //画刷
    QBrush * brush;
    //背景色
    QColor * bgColor;
    //贪吃蛇
    QVector<SnakeNode*> * snake;
    //食物
    SnakeNode * foodNode;
    //蛇头
    QPixmap snakeHead;
    //当前移动的方向 默认向右
    Direction currentDirection = Direction::RIGHT;
    //上次移动的方向
    Direction oldDirection = Direction::DOWN; //默认是图片的方向
    //定时器
    QTimer * timer;
    //关卡
    int level = 1;
    //总分
    int totalScore = 0;
    //当前关卡得分
    int currrentLevleScore = 0;
    //吃一个得多少分
    const int SCORE_FACTOR = 10;
    //当前关卡通过所需分数
    int passRequiredScore;

};

#endif // SnakeWidget_H
